package  
{
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;
	/**
	 * ...
	 * @author Jesse
	 */
	public class Main extends MovieClip
	{
		//Variável de criação do Cenário
		var cenario : Cenario;
		
		//Variável de criação da Hud
		var hud : Hud;
		
		//Variável de criação do Menu
		var menu : Menu;
		
		//Variável de Criação dos Zumbies de acordo com tempo
		var contadorInimigo : int;
		
		//Nexus Humano
		var nexus : Nexus;
		
		//Nexus Zumbie
		var nexus2 : Nexus;
		
		//Variáveis de Criação dos Humanos
		var AR_humanos : Array;
		
		var soldadoH : Humanos;
		var AR_soldadoH : Array;
		var soldadoHDelay : int;
		
		var mago : Humanos;
		var AR_mago : Array;
		var magoDelay : int;
		
		var cavaleiro : Humanos;
		var AR_cav : Array;
		var cavDelay : int;
		
		var dragao : Humanos;
		var AR_dragao : Array;
		var dragaoDelay : int;
		
		//Variáveis de Criação dos Zumbies
		var AR_zumbies : Array;
		
		var soldadoZ : Zumbies;
		var AR_soldadoZ : Array;
		var soldadoZDelay : int;
		
		var necromante : Zumbies;
		var AR_necro : Array;
		var necroDelay : int;
		
		var gargula : Zumbies;
		var AR_gargula : Array;
		var gargulaDelay : int;
		
		var golem : Zumbies;
		var AR_golem : Array;
		var golemDelay : int;
		
		//Variáveis das Torres de criação de tropas:
		var podeCriar1 : Boolean;
		var podeCriar2 : Boolean;
		var podeCriar3 : Boolean;
		var podeCriar4 : Boolean;
		
		var torre1 : MovieClip;
		var torre2 : MovieClip;
		var torre3 : MovieClip;
		var torre4 : MovieClip;
		
		public function Main() 
		{
			AR_humanos = []
			
			AR_zumbies = []
			
			contadorInimigo = 0
			
			podeCriar1 = true
			podeCriar2 = true
			podeCriar3 = true
			podeCriar4 = true
			
			//Definição das funções dos Humanos
			AR_soldadoH = [];
			soldadoHDelay = 0;
			
			AR_mago = []
			magoDelay = 0
			
			AR_cav = []
			cavDelay = 0
			
			AR_dragao = []
			dragaoDelay = 0
			
			//Definição das funções dos Zumbies
			AR_soldadoZ = [];
			soldadoZDelay = 0;
			
			AR_necro = []
			necroDelay = 0
			
			AR_gargula = []
			gargulaDelay = 0
			
			AR_golem = []
			golemDelay = 0
			
			//Funções:
			desenharMenu();
		}
		
		public function update (e:Event) : void
		{
			criarHumano();
			criarZumbie();
			colisao();
			morrer();
		}
		
		public function desenharTela () : void
		{
			//Criação do Cenário
			cenario = new Cenario();
			cenario.x = 0;
			cenario.y = 0;
			addChild(cenario);
			
			//Criação da Hud
			hud = new Hud;
			hud.x = 0;
			hud.y = 0;
			addChild (hud);
			
			nexus = new Nexus();
			nexus.x = stage.stageWidth / 10;
			nexus.y = stage.stageHeight * 0.7  + nexus.height / 1.1;
			addChildAt(nexus, 2);
			nexus.gotoAndStop("cheio")
			
			nexus2 = new Nexus();
			nexus2.x = stage.stageWidth * 0.9;
			nexus2.y = stage.stageHeight * 0.7  + nexus.height / 1.1;
			addChildAt(nexus2, 2);
			nexus2.gotoAndStop("cheio")
			
			//Ouvidores de Eventos
			addEventListener (Event.ENTER_FRAME, update)
			hud.inter.btTorre1.addEventListener(MouseEvent.CLICK, criarTorre1);
			hud.inter.btTorre2.addEventListener(MouseEvent.CLICK, criarTorre2);
			hud.inter.btTorre3.addEventListener(MouseEvent.CLICK, criarTorre3);
			hud.inter.btTorre4.addEventListener(MouseEvent.CLICK, criarTorre4);
		}
		
		public function desenharMenu():void
		{
			menu = new Menu();
			menu.x = stage.stageWidth / 2;
			menu.y = stage.stageHeight / 2;
			addChild(menu);
			
			menu.btIniciar.addEventListener(MouseEvent.CLICK, iniciarJogo);
		}
		
		public function iniciarJogo(e:MouseEvent):void
		{
			removeChild(menu);
			menu = null;
			
			desenharTela();
		}
		
		public function criarHumano () : void
		{
			
			if (torre1 != null)
			{
				soldadoHDelay++
				if (soldadoHDelay >= 360)
				{
					soldadoH = new Humanos(1);
					soldadoH.x = - soldadoH.width/2;
					soldadoH.y = (stage.stageHeight * 0.7 + cenario.caminho.height / 2) + (Math.floor(Math.random()*3) * cenario.caminho.height/3);
					addChildAt(soldadoH,numChildren -1);
					AR_soldadoH.push(soldadoH);
					AR_humanos.push(soldadoH);
					
					soldadoHDelay = 0;
				}
			}
			
			
			if (torre2 != null)
			{
				magoDelay++
				if (magoDelay >= 360)
				{
					mago = new Humanos (2);
					mago.x = -mago.width / 2;
					mago.y = (stage.stageHeight * 0.7 + cenario.caminho.height / 2) + (Math.floor(Math.random() * 3) * cenario.caminho.height / 3);
					addChildAt(mago, numChildren -1);
					AR_mago.push(mago);
					AR_humanos.push(mago);
					
					magoDelay = 0;
				}
			}
			
			if (torre3 != null)
			{
				cavDelay++
				if (cavDelay >= 540)
				{
					cavaleiro = new Humanos (4);
					cavaleiro.x = -cavaleiro.width / 2;
					cavaleiro.y = (stage.stageHeight * 0.7 + cenario.caminho.height / 2) + (Math.floor(Math.random() * 3) * cenario.caminho.height / 3);
					addChildAt(cavaleiro, numChildren -1);
					AR_cav.push(cavaleiro);
					AR_humanos.push(cavaleiro);
					
					cavDelay = 0
				}
			}
			
			if (torre4 != null)
			{
				dragaoDelay++
				if (dragaoDelay >= 540)
				{
					dragao = new Humanos (3);
					dragao.x = -dragao.width / 2;
					dragao.y = (stage.stageHeight * 0.695 - cenario.caminho.height / 2) - (Math.floor(Math.random() * 2) * cenario.caminho.height / 3);
					addChildAt(dragao, numChildren -1);
					AR_dragao.push(dragao);
					AR_humanos.push(dragao);
					
					dragaoDelay = 0
				}
			}
		}
		
		public function criarZumbie () : void
		{
			soldadoZDelay++
			if (soldadoZDelay >= 180)
			{
				soldadoZ = new Zumbies (1);
				soldadoZ.x = stage.stageWidth + soldadoZ.width / 2;
				soldadoZ.y = (stage.stageHeight * 0.7 + cenario.caminho.height / 2) + (Math.floor(Math.random()*3) * cenario.caminho.height/3);
				addChildAt(soldadoZ, numChildren -1);
				AR_soldadoZ.push(soldadoZ);
				AR_zumbies.push(soldadoZ);
				
				soldadoZDelay = 0;
			}
			
			if (contadorInimigo >= 2160)
			{
				necroDelay++
				if (necroDelay >= 360)
				{
					necromante = new Zumbies (2);
					necromante.x = stage.stageWidth + necromante.width / 2;
					necromante.y = (stage.stageHeight * 0.7 + cenario.caminho.height / 2) + (Math.floor(Math.random()*3) * cenario.caminho.height/3);
					addChildAt(necromante, numChildren -1);
					AR_necro.push(necromante);
					AR_zumbies.push(necromante);
					
					necroDelay = 0;
				}
			}
			
			if (contadorInimigo >= 4320)
			{
				golemDelay++
				if (golemDelay >= 720)
				{
					golem = new Zumbies (4);
					golem.x = stage.stageWidth + golem.width / 2;
					golem.y = (stage.stageHeight * 0.7 + cenario.caminho.height / 2) + (Math.floor(Math.random()*3) * cenario.caminho.height/3);
					addChildAt(golem, numChildren -1);
					AR_golem.push(golem);
					AR_zumbies.push(golem);
					
					golemDelay = 0;
				}
			}
			
			if (contadorInimigo >= 6480)
			{
				gargulaDelay++
				if (gargulaDelay >= 540)
				{
					gargula = new Zumbies (3);
					gargula.x = stage.stageWidth + gargula.width / 2;
					gargula.y = (stage.stageHeight * 0.695 - cenario.caminho.height / 2) - (Math.floor(Math.random() * 2) * cenario.caminho.height / 3);
					addChildAt(gargula,1)
					AR_gargula.push(gargula);
					AR_zumbies.push(gargula);
					
					gargulaDelay = 0;
				}
			}
		}
		
		public function colisao():void
		{
			if (AR_humanos.length > 0 && AR_zumbies.length > 0)
			{
				for (var i : int = 0; i < AR_humanos.length; i++)
				{
					for (var u : int = 0; u < AR_zumbies.length; u++)
					{
						if (AR_humanos[i].hitTestObject(AR_zumbies[u]) && AR_humanos[i].y == AR_zumbies[u].y)
						{	
							AR_humanos[i].velocidadeH = 0;
							AR_zumbies[u].velocidadeZ = 0;
							
							AR_humanos[i].animacao = "atacando"
							AR_zumbies[u].animacao = "atacando"
							
							AR_humanos[i].vidaH -= AR_zumbies[u].atackZ;
							AR_zumbies[u].vidaZ -= AR_humanos[i].atackH;
						}
					}
				}
			}
			//esse for somente e chama se houver zumbis na array AR_zumbis
			if (AR_zumbies.length > 0)
			{
				for (u = 0; u < AR_zumbies.length; u++)
				{
					if (AR_zumbies[u].hitTestObject(nexus))
					{
						AR_zumbies[u].velocidadeZ = 0;
						AR_zumbies[u].animacao = "atacando";
						
						nexus.vidaBaseH--;
						hud.vidaAtualH--;
					}
				}
			}
			
			//esse for somente e chama se houver humanos na array AR_humanos
			if (AR_humanos.length > 0)
			{
				for (i = 0; i < AR_humanos.length; i++)
				{
					if (AR_humanos[i].hitTestObject(nexus2))
					{
						AR_humanos[i].velocidade = 0;
						AR_humanos[i].animacao = "atacando";
						
						nexus2.vidaBaseH--;
						hud.vidaAtualZ--;
					}
				}
			}
			
			
		}
		
		public function morrer():void
		{
			if (AR_humanos.length > 0 && AR_zumbies.length > 0)
			{
				for (var i : int = 0; i < AR_humanos.length; i++)
				{
					for (var u : int = 0; u < AR_zumbies.length; u++)
					{
						if (AR_humanos[i].vidaH <= 0)
						{
							removeChild(AR_humanos[i]);
							AR_humanos.splice(i, 1);
							AR_zumbies[u].velocidadeZ = 2;
							AR_zumbies[u].animacao = "andando";
							return;
						}	
						
						else if (AR_zumbies[u].vidaZ <= 0)
						{
							removeChild(AR_zumbies[u]);
							AR_zumbies.splice(u, 1);
							AR_humanos[i].velocidadeH = 3;
							AR_humanos[i].animacao = "andando";
							hud.numGold += 10;
							return;
						}	
					}	
				}
			}
		}
		
		
		public function criarTorre1 (e: MouseEvent) : void
		{
			if (podeCriar1 == true && hud.numGold >= 150)
			{
				torre1 = new Torre1();
				torre1.x = stage.stageWidth / 14;
				torre1.y = stage.stageHeight * 0.73
				addChildAt(torre1, 1);
				
				podeCriar1 = false;
				hud.numGold -= 150
			}
		}
		
		public function criarTorre2 (e: MouseEvent) : void
		{
			if (podeCriar2 == true && hud.numGold >= 300)
			{
				torre2 = new Torre2();
				torre2.x = torre1.x + torre2.height/1.5;
				torre2.y = stage.stageHeight * 0.7;
				addChildAt(torre2, 1);
				
				podeCriar2 = false;
				hud.numGold -= 300
			}
		}
		
		public function criarTorre3 (e: MouseEvent) : void
		{
			if (podeCriar3 == true && hud.numGold >= 300)
			{
				torre3 = new Torre3();
				torre3.x = torre1.x * 2 + torre3.width/0.8;
				torre3.y = stage.stageHeight * 0.72;
				addChildAt(torre3, 1);
				
				podeCriar3 = false;
				hud.numGold -= 300;
			}
		}
		
		public function criarTorre4 (e: MouseEvent) : void
		{
			if (podeCriar4 == true && hud.numGold >= 600)
			{
				torre4 = new Torre4();
				torre4.x = torre1.x * 3 + torre4.width;
				torre4.y = stage.stageHeight * 0.71;
				addChildAt(torre4, 1);
				
				podeCriar4 = false;
				hud.numGold -= 600;
			}
		}
	}
}